package co.edu.udea.iw.tusanimes.dao.impl;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import co.edu.udea.iw.tusanimes.dao.SerieDao;
import co.edu.udea.iw.tusanimes.dao.exception.DAOException;
import co.edu.udea.iw.tusanimes.dto.Serie;


/**
 * 
 * Implementaci�n de la Interfaz SerieDao
 * 
 * @author Camila Naranjo
 * @versi�n 1.0
 * 
 */
public class SerieDaoImpl extends HibernateDaoSupport implements SerieDao {

	/**
	 * Buscar Serie
	 * 
	 * @param Nombre
	 *            Nombre de la serie a buscar.
	 * @return Serie Serie encontrada.
	 * @throws DAOException
	 */
	@SuppressWarnings("unchecked")
	@Override
	public List<Serie> buscar(String Nombre) throws DAOException {
		List<Serie> series = null;

		try {
			Session sesion = getSession();
			series = (List<Serie>) sesion.createCriteria(Serie.class)
					.add(Restrictions.eq("nombre", Nombre))
					.addOrder(Order.asc("nombre"))
					.list();
	
		} catch (HibernateException e) {
			throw new DAOException();
		}

		return series;

	}

	/**
	 * Eliminar Serie
	 * 
	 * @param id
	 *            Id de la serie a eliminar.
	 * @throws DAOException
	 */

	@Override
	public void eliminar(int id) throws DAOException {
		Session session = null;
		Transaction tx = null;
		Query query = null;
		String sql;

		try {
			sql = "delete from Serie where idSerie = :id";
			session = getSession();
			tx = session.beginTransaction();
			query = session.createQuery(sql);

			query.setInteger("id", id);
			query.executeUpdate();
			tx.commit();
		} catch (HibernateException e) {
			throw new DAOException();
		}
	}

	/**
	 * Actualizar Serie
	 * 
	 * @param serie
	 *            Serie a actualizar.
	 * @return Serie Serie actualizada.
	 * @throws DAOException
	 */
	public Serie actualizarSerie(Serie serie) throws DAOException {
		Transaction tx = null;
		try {
			Session session = getSession();
			tx = session.beginTransaction();
			session.update(serie);
			tx.commit();
		} catch (HibernateException e) {
			throw new DAOException();
		}
		return serie;
	}

	/**
	 * Registrar Serie
	 * 
	 * @param nuevaSerie
	 *            Serie a registrar.
	 * @return Serie Serie registrada.
	 * @throws DAOException
	 */
	public Serie registrarSerie(Serie nuevaSerie) throws DAOException {
		Transaction tx = null;
		try {
			Session session = getSession();
			tx = session.beginTransaction();
			session.save(nuevaSerie);
			tx.commit();
		} catch (HibernateException e) {
			throw new DAOException();
		}

		return nuevaSerie;
	}

	@Override
	public Serie buscarId(int id) throws DAOException {
		Serie serie = null;

		try {
			Session sesion = getSession();
			serie = (Serie) sesion.createCriteria(Serie.class)
					.add(Restrictions.eq("id", id)).uniqueResult();
		} catch (HibernateException e) {
			throw new DAOException();
		}

		return serie;
	}

}
